Skip to content

方案一:直接获取bean

java
@Service
public class ClassA extends BaseClass{

        @Transactional(propagation = Propagation.REQUIRES_NEW)    @Override
        public void methodA(){

        }

        /**
         * 这里调用methodA() 的事务将会失效
         */    
        public void methodB(){
        //使用getBean
    ((BaseClass)SpringUtil.getBean("classA")).methodA();
        }
}

方案二:使用cglib代理

第一步:

SpringBoot:注解开启cglib代理,开启 exposeProxy = true,暴露代理对象 (否则AopContext.currentProxy()) 会抛出异常

java
@EnableAspectJAutoProxy(exposeProxy = true)
public class Application{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

xml模式

xml
<aop:aspectj-autoproxy expose-proxy="true"/>

第二步:

(需要保证Spring对这个bean创建了代理对象,基本上涉及到Aop的方法的类,都会创建代理对象) 可以用以下代码判断

java
@Service("classImplProxy")
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
public class ClassImplProxy implements IClass {

    @Override
    @Transactional
    public void sysout() {
    }

    //是否代理对象
    @Override
    public boolean isAopProxy() {
        return AopUtils.isAopProxy(AopContext.currentProxy());
    }

    //是否cglib 代理对象
    @Override
    public boolean isCglibProxy() {
        return AopUtils.isCglibProxy(AopContext.currentProxy());
    }

    //是否jdk动态代理
    @Override
    public boolean isJdkDynamicProxy() {
        return AopUtils.isJdkDynamicProxy(AopContext.currentProxy());
    }
}
java
@Service
public class ClassA{

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodA(){

    }

    public void methodB(){
        //手动获取此对象Spring的代理类
        ((ClassA)AopContext.currentProxy()).methodA();
    }

}

方案三:

直接在当前类@Autowire 或者@Resource 注入自己,然后用注入的bean 调用方法

Last updated: